#!/usr/bin/env python
# coding: utf-8

# ## 准备

# In[1]:


pip install requests-html


# In[18]:


import pandas as pd
import requests
import requests_html
from requests_html import HTMLSession
import urllib.parse


# In[19]:


# 解析url
url = "https://search.51job.com/list/000000,000000,0000,00,9,99,+,2,1.html?lang=c&postchannel=0000&workyear=99&cotype=99&degreefrom=99&jobterm=99&companysize=99&ord_field=0&dibiaoid=0&line=&welfare="
session = HTMLSession()
headers = {
    
}
r = session.get(url,headers=headers)


# In[20]:


r


# In[21]:


_SEARCH_ = "http:"+r.html.xpath('//script')[-3].html.split("\"")[3]
_SEARCH_


# In[22]:


js = requests.get(_SEARCH_)
js.content.decode("gbk","ignore")
参数 = js.content.decode("gbk","ignore")
参数


# ## 构建参数模板

# ### 工作年限

# In[76]:


工作年限 = 参数.split("search_workyear=")[1].split(",window.d_search_providesalary")[0]
工作年限


# In[77]:


工作年限_ini = 工作年限.replace('{k:"','').replace('",v:"',':').replace('[','').replace(']','').replace('"}','')
分类1 = 工作年限_ini.split(',')
分类1


# In[78]:


工作年限_str = ["所有","在校生/应届生","1-3年","3-5年","5-10年","10年以上","无需经验"]
参数构建_工作年限 = {工作年限_str[i]:分类1[i].split(':')[0] for i in range(len(分类1))}
参数构建_工作年限


# ### 学历要求

# In[80]:


学历要求 = 参数.split("search_degreefrom=")[1].split(",window.d_search_jobterm")[0]
学历要求


# In[81]:


学历要求_ini = 学历要求.replace('{k:"','').replace('",v:"',':').replace('[','').replace(']','').replace('"}','')
分类2 = 学历要求_ini.split(',')
分类2


# In[87]:


学历要求_str = ["所有","初中及以下","高中/中技/中专","大专","本科","硕士","博士","无学历要求"]
参数构建_学历要求 = {学历要求_str[i]:分类2[i].split(':')[0] for i in range(len(分类2))}
参数构建_学历要求


# ### 公司性质

# In[64]:


公司性质 = 参数.split("search_cottype=")[1].split(",window.d_search_workyear")[0]
公司性质


# In[67]:


公司性质_ini = 公司性质.replace('{k:"','').replace('",v:"',':').replace('[','').replace(']','').replace('"}','')
分类3 = 公司性质_ini.split(',')
分类3


# In[88]:


公司性质_str = ["所有","国企","外资（欧美）","外资（非欧美）","上市公司","合资","民营公司","外企代表处","政府机关","事业单位","非营利组织","创业公司"]
参数构建_公司性质 = {公司性质_str[i]:分类3[i].split(':')[0] for i in range(len(分类3))}
参数构建_公司性质


# ### 参数模板

# In[107]:


参数模板 = urllib.parse.urlparse(url)
参数模板_list = pd.Series(参数模板).tolist()
参数模板_list


# In[108]:


参数模板_dict = {i.split("=")[0]:i.split("=")[1] for i in 参数模板.query.split("&")}
参数模板_dict


# In[109]:


def 参数模板_51job(workyear,degreefrom,cotype):
    workyear_values = 参数构建_工作年限[workyear]
    degreefrom_values = 参数构建_学历要求[degreefrom]
    cotype_values = 参数构建_公司性质[cotype]
    参数模版_dict["cotype"] = cotype_values
    参数模版_dict["workyear"] = workyear_values
    参数模版_dict["degreefrom"] = degreefrom_values
    query_所有 = "&".join([k+"="+v for k,v in 参数模版_dict.items()])
    参数模版_list[4] = query_所有
    url_参数 =  urllib.parse.urlunparse(参数模版_list)      
    return (url_参数)


# In[118]:


#选择学历要求为本科
参数模板_51job('所有','本科','所有')


# ## 关键词

# In[119]:


keyword = urllib.parse.quote("产品运营")
keyword


# In[206]:


cotype = '所有'
workyear = '本科'
degreefrom = '所有'
url = 参数模板_51job(cotype,workyear,degreefrom)
产品运营 = url.replace('+',keyword)
产品运营


# ## 页面内容

# In[135]:


session = HTMLSession()
r = session.get(产品运营)
__SEARCH_RESULT__ = r.html.xpath('//script')[-4].html.split("__SEARCH_RESULT__ = ")[1].split("</script>")[0]
results = eval(__SEARCH_RESULT__)
results


# In[136]:


pd.set_option('display.max_rows', None)
pd.set_option('max_colwidth',1000)
页面内容 = pd.DataFrame(results['engine_search_result'])
页面内容


# ### 详情页

# In[191]:


招聘内容_df["job_href"]


# In[167]:


#修正反双斜杠
详情页 = list(招聘内容_df['job_href'])
SYMBOLS = '\\'


# In[168]:


详情页_url = []
for i in 详情页:
    temp = ""
    for j in i:
        if j not in SYMBOLS:
            temp += j
    详情页_url.append(temp)
详情页_url


# In[205]:


for i in 详情页_url:
    session = HTMLSession()
    r = session.get(i)
    职称.append(r.html.xpath('//div[@class="tCompanyPage"]/div[@class="tCompany_center clearfix"]/div/div/div/h1/@title'))
    公司信息.append(r.html.xpath('//div[@class="tCompanyPage"]//div[@class="cn"]//a[@class="catn"]'))
    薪酬.append(r.html.xpath('//div[@class="tCompanyPage"]/div[@class="tCompany_center clearfix"]/div[@class="tHeader tHjob"]/div[@class="in"]/div[@class="cn"]/strong/text()'))
    职位信息.append(r.html.xpath('//div[@class="tCompanyPage"]/div[@class="tCompany_center clearfix"]/div[@class="tCompany_main"]/div[@class="tBorderTop_box"]/div[@class="bmsg job_msg inbox"]/p/text()'))

df_data = pd.DataFrame({
    "职称":职称,
    "公司信息":公司信息,
    "薪酬":薪酬,
    "职位信息":职位信息,
    })
df_data


# ## 翻页

# In[207]:


产品运营_翻页 = []
for j in range(1,11):
    产品运营_翻页.append("https://search.51job.com/list/000000,000000,0000,00,9,99,%25E4%25BA%25A7%25E5%2593%2581%25E8%25BF%2590%25E8%2590%25A5,2,{num}.html?lang=c&postchannel=0000&workyear=99&cotype=99&degreefrom=04&jobterm=99&companysize=99&ord_field=0&dibiaoid=0&line=&welfare=".format(num = j))
产品运营_翻页


# In[215]:


翻页=[]
for h in 产品运营_翻页:
    session = HTMLSession()
    翻页.append(session.get(h))
翻页


# In[216]:


results = []
for i in 翻页:
    __SEARCH_RESULT__ = i.html.xpath('//script')[-4].html.split("__SEARCH_RESULT__ = ")[1].split("</script>")[0]
    results.append(eval(__SEARCH_RESULT__))
results


# In[217]:


list_res = []
for page in range(10):
    list_res.append(results[page])
list_res[0]['engine_search_result']


# In[218]:


翻页详情 = []
for v in range(10):
    for n in range(50):
        翻页详情.append(list_res[v]['engine_search_result'][n]['job_href'])
#修正反双斜杠
详情2 = list(翻页详情)
SYMBOLS = '\\'
详情2_url = []
for i in 详情2:
    temp = ""
    for j in i:
        if j not in SYMBOLS:
            temp += j
    详情2_url.append(temp)
详情2_url


# In[219]:


#爬取
for i in 详情2_url:
    session = HTMLSession()
    r = session.get(i)
    职称.append(r.html.xpath('//div[@class="tCompanyPage"]/div[@class="tCompany_center clearfix"]/div/div/div/h1/@title'))
    公司信息.append(r.html.xpath('//div[@class="tCompanyPage"]//div[@class="cn"]//a[@class="catn"]'))
    薪酬.append(r.html.xpath('//div[@class="tCompanyPage"]/div[@class="tCompany_center clearfix"]/div[@class="tHeader tHjob"]/div[@class="in"]/div[@class="cn"]/strong/text()'))
    职位信息.append(r.html.xpath('//div[@class="tCompanyPage"]/div[@class="tCompany_center clearfix"]/div[@class="tCompany_main"]/div[@class="tBorderTop_box"]/div[@class="bmsg job_msg inbox"]/p/text()'))
df_data = pd.DataFrame({
    "职称":职称,
    "公司信息":公司信息,
    "薪酬":薪酬,
    "职位信息":职位信息,
    })
df_data


# In[ ]:




